package br.com.view;

import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import br.com.beans.NodeList;

public class GradeNode extends GridPane {

	private Label labelRetornoIdNode;
	private Label labelIdNode;
	private Label labelRetornoTipo;
	private Label labelTipo;
	private Label labelRetornoModelo;
	private Label labelModelo;
	private Label labelRetornoVerFirmware;
	private Label labelVerFirmware;
	private Label labelRetornoDataInstalação;
	private Label labelDataInstalação;
	private static Arvore arvore;
	private NodeList nodes;

	@SuppressWarnings("static-access")
	public GradeNode() {

		if (arvore == null) {
			arvore = new Arvore();
		}

		this.setHgap(3);
		this.setVgap(3);
		this.setPadding(new Insets(3));
		this.setAlignment(Pos.CENTER_LEFT);

		labelIdNode = new Label("Nó: ");
		this.setConstraints(labelIdNode, 0, 1);

		labelRetornoIdNode = new Label();
		this.setConstraints(labelRetornoIdNode, 1, 1);

		labelTipo = new Label("Tipo: ");
		this.setConstraints(labelTipo, 0, 2);

		labelRetornoTipo = new Label();
		this.setConstraints(labelRetornoTipo, 1, 2);

		labelModelo = new Label("Modelo: ");
		this.setConstraints(labelModelo, 0, 3);

		labelRetornoModelo = new Label();
		this.setConstraints(labelRetornoModelo, 1, 3);

		labelDataInstalação = new Label("Data de instalação: ");
		this.setConstraints(labelDataInstalação, 0, 4);

		labelRetornoDataInstalação = new Label();
		this.setConstraints(labelRetornoDataInstalação, 1, 4);

		labelVerFirmware = new Label("Versão do Firmware: ");
		this.setConstraints(labelVerFirmware, 0, 5);

		labelRetornoVerFirmware = new Label();
		this.setConstraints(labelRetornoVerFirmware, 1, 5);

		this.getChildren().addAll(labelIdNode, labelRetornoIdNode, labelTipo,
				labelRetornoTipo, labelModelo, labelRetornoModelo, labelDataInstalação,
				labelRetornoDataInstalação, labelVerFirmware, labelRetornoVerFirmware);

		final StringProperty textoSelecionadoNaArvore =
				arvore.textoNodeSelecionadoProperty();
		textoSelecionadoNaArvore.addListener(new ChangeListener<String>() {

			@Override
			public void changed(ObservableValue<? extends String> observable,
					String oldValue, String newValue) {

				if (nodes == null) {
					GradeNode.this.nodes = new NodeList(arvore.getTextoCPUselecionada());
				}

				// Passando o nomeda CPU como argumento. A CPU é setada na
				// Classe Arvore
				arvore.textoCPUselecionadaProperty().addListener(
						new ChangeListener<String>() {

							// Apenas instancia uma nova classe NodeList para
							// adquirir a lista de Nodes caso mude a CPU
							// selecionada
							@Override
							public void changed(
									ObservableValue<? extends String> observable,
									String oldValue, String newValue) {
								System.out.println("GradeNode >> Mudando a CPU para "
										+ newValue);
								GradeNode.this.nodes =
										new NodeList(arvore.getTextoCPUselecionada());

							}
						});
				if (nodes != null
						&& nodes.getListaIdNode().get(newValue) != null) {

					GradeNode.this.labelRetornoIdNode.setText(String.valueOf(nodes
							.getListaIdNode().get(observable.getValue())));

					GradeNode.this.labelRetornoModelo.setText(nodes.getListaModeloNode()
							.get(observable.getValue()));

					GradeNode.this.labelRetornoTipo.setText(nodes.getListaTipoNode().get(
							observable.getValue()));

					GradeNode.this.labelRetornoDataInstalação.setText(nodes
							.getListaDataInstalaçãoNode().get(observable.getValue()));

					GradeNode.this.labelRetornoVerFirmware.setText(nodes
							.getListaVerFirmwareNode().get(observable.getValue()));
				}
				else {

					GradeNode.this.labelRetornoIdNode.setText("");

					GradeNode.this.labelRetornoModelo.setText("");

					GradeNode.this.labelRetornoTipo.setText("");

					GradeNode.this.labelRetornoDataInstalação.setText("");

					GradeNode.this.labelRetornoVerFirmware.setText("");

				}

			}

		});

	}
}
